/**
 * Systemprogrammierung
 * Multiplayer-Quiz
 *
 * Gemeinsam verwendete Module
 *
 * \file	common/rfc.h
 * \author	Stefan Reppner, Sebastian Müller, David Biskupek, Stefan Bisinger
 *
 * \brief	Definitionen für das Netzwerkprotokoll
 */

#ifndef RFC_H
#define RFC_H

/**
 * \defgroup RFC_TYPES RFC-Nachrichten-Typen
 *
 * \{*/

/** \brief Login-Request */
#define LOGIN_REQUEST 1
/** \brief Login-Response */
#define LOGIN_RESPONSE_OK 2
/** \brief Catalog-Request */
#define CATALOG_REQUEST 3
/** \brief Catalog-Response */
#define CATALOG_RESPONSE 4
/** \brief Catalog-Change */
#define CATALOG_CHANGE 5
/** \brief Player-List */
#define PLAYER_LIST 6
/** \brief Start-Game */
#define START_GAME 7
/** \brief Question-Request */
#define QUESTION_REQUEST 8
/** \brief Question */
#define QUESTION 9
/** \brief Question-Answered */
#define QUESTION_ANSWERED 10
/** \brief Question-Result */
#define QUESTION_RESULT 11
/** \brief Game-Over */
#define GAME_OVER 12
/** \brief Error-Message */
#define ERROR_WARNING 255

/** \}*/

/** \brief RFC-HEADER-Länge */
#define HEADER_LENGTH 3

/**
 * \defgroup RFC_Error RFC-Error-Subtypes
 *
 * \{*/

/** \brief Warnung */
#define WARNING 0
/** \brief Fataler Fehler */
#define FATAL 1

/** \}*/

/**
 * \defgroup Com_Error Communication-Error-Subtypes
 *
 * \{*/

/** \brief Unbekannter RFC-Typ */
#define RFC_UNKNOWN -1
/** \brief Fehler bei Kommunikation über Socket */
#define SOCKET_ERROR -2
/** \brief Fehler der Send-Methode */
#define SEND_ERROR -3
/** \brief Fehler der Recv-Methode */
#define RECEIVE_ERROR -4
/** \brief allgemeiner Com-Error */
#define COM_ERR -5

/** \}*/

/**
 * \defgroup Server_Error Server-Error-Subtypes
 *
 * \{*/

/** \brief Server voll */
#define SERVER_FULL 254
/** \brief Name bereits vergeben */
#define NAME_EXISTS 253
/** \brief Fehler bei Thread */
#define THREAD_ERROR 252
/** \brief Unbekannter Fehler */
#define UNKNOWN_ERROR 251
/** \brief Keine User */
#define NO_USERS 250
/** \brief Spielleiter hat Server verlassen */
#define SPIELLEITER_LEFT 249
/** \brief Client hat Server verlassen */
#define CLIENT_LEFT 248
/** \brief Spiel läuft */
#define GAME_RUNNING 247
/** \brief Katalog konnte nicht geladen werden */
#define CATALOG_ERROR 246
/** \brief Nur noch ein Spieler auf Server */
#define ONLY_ONE 245

/** \}*/

/** \brief Maximale Useranzahl */
# define MAX_USERS 6

/* ** ** ** Includes ** ** ** */

#include "common/question.h"

/* ** ** ** Strukturen für RFC-Nachrichten ** ** ** */

#pragma pack(1)

/** \brief Struktur für RFC-Header
 *  \note Padding mit #pragma pack(1) verhindert */
struct RFC_HEADER {
	uint8_t type;
	uint16_t length;
};

/** \brief Struktur für RFC-Nachricht
 *  \note Padding mit #pragma pack(1) verhindert */
struct RFC_MSG {
	struct RFC_HEADER header;
	void* data;
};

#pragma pack(0)

/* ... */

#endif
